#include "scrolllabel.h"

#include "environment.h"
//#include <QDebug>

ScrollLabel::ScrollLabel(uint number, QWidget *parent):
    QLabel(parent), mNumber(number)
{
    m_isOnlyShowTxt = false;
    isHide = false;
    mOffset = 0;
    mTimeId = 0;
    mSpeed = 10;
    mInterval = 30;

    mScrollType = HORIZONTALSCROLL;
    mLogoImg.load(NULL);

#ifdef _TTY_POSIX_
    Configclass configclass;
//    mFont.setFamily(configclass.getSysFont());
//    mFont.setFamily("Africain");
//    mFont.setFamily("111");

#endif


    mFont.setPixelSize(20);
    mPen.setBrush(Qt::red);

    this->setWordColor(166, 62, 105);
    this->setBGColor(0, 0, 255);

    timer = new QTimer(this);
    timer->setSingleShot(true);

    scrollTimer = new QTimer(this);
    scrollTimer->setSingleShot(false);
    connect(scrollTimer, SIGNAL(timeout()), this, SLOT(scrollText()));

    this->setFont(mFont);

//    qRegisterMetaType<QTimer>("QTimer");

//    QPalette palette;
//    palette.setColor(QPalette::Background, QColor(0,0,255));
//    this->setPalette(palette);

}

void ScrollLabel::setOnlyShowTxt(bool isOnlyShowTxt, const QString &txt)
{
    m_isOnlyShowTxt = isOnlyShowTxt;
    if (isOnlyShowTxt)
    {
        this->setBGColor(20, 30, 80);
//        this->setScrollType(VERTICALSCROLL);
        mScrollText = txt;

        if (mScrollType == VERTICALSCROLL)
        {
            textList = mScrollText.split("");
            textList.removeFirst();
            textList.removeLast();
        }

        this->stop();

        this->repaint();
    }
}

/*******************************************
  description:开始滚动，无限制，调用stop()时，才停止

  ******************************************/
bool ScrollLabel::start()
{
    if (mRetainText.isEmpty())
    {
        return false;
    }


    mOffset = 0;
    mTimeId = mSpeed;
    mScrollText = mRetainText;

//    qDebug() << "mScrollText===>" << mScrollText;

    textList = mScrollText.split("");
    textList.removeFirst();
    textList.removeLast();

    update();
    updateGeometry();
    scrollTimer->start(mSpeed);

    mTimeId = mSpeed;



    return true;
}

void ScrollLabel::setRect(int ax, int ay, int aw, int ah)
{
    msize.setWidth(aw);
    msize.setHeight(ah);

    m_rect.setX(ax);
    m_rect.setY(ay);
    m_rect.setWidth(aw);
    m_rect.setWidth(ah);
    this->setGeometry(ax, ay, aw, ah);
}

void ScrollLabel::hide()
{
    this->stop();
    QLabel::hide();
    isHide = true;
}

void ScrollLabel::show()
{
    QLabel::show();
    isHide = false;
}

int ScrollLabel::setPartitionID(const int partitionID)
{
    m_partitiodID = partitionID;
    return 1;
}

void ScrollLabel::setRect(QRect rect)
{
    m_rect = rect;
    msize.setWidth(rect.width());
    msize.setHeight(rect.height());
    this->setGeometry(rect);
}

/*******************************************
  description:开始滚动，当滚动完inval秒后停止滚动
  参数： inval为滚动的时间，单位秒

  ******************************************/
bool ScrollLabel::start(int inval)
{
    if (mRetainText.isEmpty())
    {
        return false;
    }

    mTimeId = mSpeed;
    mScrollText = mRetainText;


    textList = mScrollText.split("");
    textList.removeFirst();
    textList.removeLast();

    update();
    updateGeometry();

//    mTimeId  = startTimer(mSpeed);
    scrollTimer->start(mSpeed);

    mTimeId = mSpeed;

    timeSize = inval * 1000;
    timer->start(timeSize);
    connect(timer, SIGNAL(timeout()), this, SLOT(playTimeOutSlot()));


    return true;
}

/*******************************************
  description:停止滚动

  ******************************************/
bool ScrollLabel::stop()
{
//    this->killTimer(mSpeed);
    scrollTimer->stop();

    mTimeId = 0;
    return true;
}


/*******************************************
  description:设置想要显示的文字

  ******************************************/
//void ScrollLabel::setText(const QString &newText)
//{
//    mRetainText = newText;
////    mRetainText = QString::fromLocal8Bit(newText.toLatin1());
////    qDebug() << mRetainText << "newText" << newText;

//}


/*******************************************
  description:设置想要显示的文字

  ******************************************/
void ScrollLabel::setScrollText(const QString &newText)
{
    mRetainText = newText;
}

/*******************************************
  description:设置显示文字的颜色

  ******************************************/
void ScrollLabel::setWordColor(const int red, const int green, const int blue)
{
    mPen.setColor(QColor(red, green, blue));
}

/*******************************************
  description:设置背景的颜色

  ******************************************/
void ScrollLabel::setBGColor(const int red, const int green, const int blue)
{
    m_BGColor = QColor(red, green, blue);
}

/*******************************************
  description:设置想要显示的logo图片

  ******************************************/
void ScrollLabel::setLogoPath(const QString &strLogoPath)
{
    mLogoImg.load(strLogoPath);
    mLogoWidth = mLogoImg.width();
}

/*******************************************
  description:不想要显示logo,用此函数去掉logo

  ******************************************/
void ScrollLabel::clearLogo()
{
    //用一个空的QImage覆盖掉原来的mImage
    mLogoImg = QImage();
}

/*******************************************
  description:设置默认参数

  ******************************************/
void ScrollLabel::setDefaultSetting()
{
    mOffset = 0;
    mTimeId = 0;
    mSpeed = 30;
    mInterval = 30;

    mScrollType = HORIZONTALSCROLL;
    mLogoImg.load(NULL);

    this->setWordColor(166, 62, 105);

    mFont.setPixelSize(20);
    this->setFont(mFont);

    update();
}


/*******************************************
  description:设置字体大小

  ******************************************/
void ScrollLabel::setFontWidth(int iFontWidth)
{
    mFont.setPixelSize(iFontWidth);
    this->setFont(mFont);
    update();
    updateGeometry();
}

/*******************************************
  description:设置滚动速度(0~~100)

  ******************************************/
void ScrollLabel::setScrollSpeed(int iSpeed)
{

    iSpeed = 100 - iSpeed;

    if (iSpeed < 2)
    {
        iSpeed = 2;
    } else if (iSpeed > 100)
    {
        iSpeed = 100;
    }

    mSpeed = iSpeed;


//    mTimeId  = startTimer(mSpeed);
    if (scrollTimer->isActive())
    {
        scrollTimer->stop();        
        this->start();
        mTimeId = iSpeed;
    }
}

/*******************************************
  description:设置滚动的类型，一般有水平滚动和垂直滚动
  parameter：
  emScrollType 枚举类型，为要设置的滚动的类型

  ******************************************/
void ScrollLabel::setScrollType(SCROLLTYPE emScrollType)
{

    mScrollType = emScrollType;
    updateGeometry();
    update();
}

/*******************************************
  description:得到显示的文字
  parameter：

  ******************************************/
QString ScrollLabel::text() const
{
//    qDebug() << "mScrollText===>" << mScrollText;
    return mScrollText;
}

/*******************************************
  description:得到显示字体的长度
  parameter：

  ******************************************/
QSize ScrollLabel::sizeHint() const
{
    return fontMetrics().size(0, text());
}


/*******************************************
  description:绘制函数，
  parameter：

  ******************************************/
void ScrollLabel::paintEvent(QPaintEvent *e)
{
    if (m_isOnlyShowTxt)
    {
        QPainter painter(this);
        int textWidth = fontMetrics().width(text());

        painter.setBrush(m_BGColor);
        painter.drawRect(QRect(0, 0, GLOBAL_RESOLUTION_WIDTH, 800));

        painter.setPen(mPen);

        //如果 textWidth < 1 则说明没有可以显示的文字，返回
        if(textWidth < 1)
        {
            return;
        }

        if(mScrollType == HORIZONTALSCROLL)
        {
            int x = 0;

            painter.drawText(x, 0, msize.width(), msize.height(), \
                             Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, text());

        } else {
            int x = 0;
            int y = 0;
            int i = 0;
            QString str = tr("斯");
            while(x < msize.width() && i < textList.count())
            {
                i++;
                painter.rotate(90);
                //如果有换行符的话，那么进行换行，并把这个换行符省略，
                //继续循环，直到没有换行符为止
                while(textList.at(i) == "\n")
                {
                    y = 0;
                    x += fontMetrics().width(str)*2;
                    i++;
                    if (textList.count() <= i)
                        break;
                }

                if (y + fontMetrics().height() > msize.height())
                {
                    y = 0;
                    x += fontMetrics().width(str)*2;
                }

                painter.drawText(x, y, fontMetrics().width(textList.at(i)), fontMetrics().height(), \
                                 Qt::AlignLeft | Qt::AlignTop, textList.at(i));
                y += fontMetrics().height();



                //如果全部文字都绘制一篇之后还没超过界面的高度，则从当前位置继续开始绘制
//                if(i >= textList.count())
//                {
//                    if(!mLogoImg.isNull())
//                    {
//                        //将logo进行相应的大小转化，转化与文件高度一致
//                        //mLogoImg = mLogoImg.scaled(fontMetr, mLogoImg.height());
//                        painter.drawImage(x, y, mLogoImg);
//                        y += mLogoImg.height();
//                    }
//                    i = 0;
//                    y += mInterval;
//                }
            }

//            painter.drawText(x, y, textWidth, height(), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, text());
//            y += fontMetrics().height();
        }
    } else {

        QPainter painter(this);
        int textWidth = fontMetrics().width(text());

        //    QPen pen;
        //    pen.setBrush(Qt::blue);
        //    painter.setPen(pen);

        painter.setBrush(m_BGColor);
        painter.drawRect(QRect(0, 0, GLOBAL_RESOLUTION_WIDTH, 800));


        //    QImage image;
        //    QRgb value = qRgb(0, 0, 255); // 0xff7aa327
        //    image.setColor(0, value);

        painter.setPen(mPen);

        //如果 textWidth < 1 则说明没有可以显示的文字，返回
        if(textWidth < 1)
        {
            return;
        }

        /**************************************
    HORIZONTALSCROLL：水平滚动
    mOffset： 为滚动的距离总和，在后滚距离的开始绘制文字，从而让人感觉到文字正在的滚动

    垂直滚动则是通过每行绘制一个字，
    ***************************************/
        if(mScrollType == HORIZONTALSCROLL)
        {
            int x = -mOffset;

            //当绘制文字超过界面的宽度后就停止绘制
            while(x < width())
            {
                painter.drawText(x, 0, textWidth, height(), \
                                 Qt::AlignLeft | Qt::AlignVCenter, text());
                x += textWidth;

                //如果有设置logo的话则有文字末尾把logo绘制上去
                if(!mLogoImg.isNull())
                {
                    //将logo进行相应的大小转化，转化与文件高度一致
                    //                mLogoImg = mLogoImg.scaled(mLogoImg.width(), fontMetrics().height());

                    painter.drawImage(x, height() / 2 - mLogoImg.height()/2, mLogoImg);
                    x += mLogoWidth;
                }

                x += mInterval;
            }
        } else {

            int x = width() / 5;
            int y = mOffset * -1;
            int i = 0;

            //当绘制文字超过界面的高度后就停止绘制
            while(y < height())
            {
                painter.drawText(x, y, textWidth, height(), \
                                 Qt::AlignLeft | Qt::AlignTop, textList.at(i++));
                y += fontMetrics().height();

                //如果全部文字都绘制一篇之后还没超过界面的高度，则从当前位置继续开始绘制
                if(i >= textList.count())
                {
                    if(!mLogoImg.isNull())
                    {
                        //将logo进行相应的大小转化，转化与文件高度一致
                        //mLogoImg = mLogoImg.scaled(fontMetr, mLogoImg.height());
                        painter.drawImage(x, y, mLogoImg);
                        y += mLogoImg.height();
                    }
                    i = 0;
                    y += mInterval;
                }
            }
        }
    }
}

/*******************************************
  description:时间事件，当startTimer()当计数器计数完成后，就会调用此函数，
  每次计数完一次我们开始重新绘制一次要显示的汉字，从而能够让别人感觉到界面是在滚动着的

  parameter：

  ******************************************/
void ScrollLabel::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == mTimeId)
    {
        //滚动的距离和，通过此参数来确定要开始绘制位置
        ++mOffset;

        //如果的水平滚动的话，滚动总距离和大于显示文字总宽度后开始新一轮的滚动
        if (mScrollType == HORIZONTALSCROLL)
        {
            //如果有设置LOGO的话则要将LOGO的宽度加进去
            if (mLogoImg.isNull())
            {
                if (mOffset >= (fontMetrics().width(text())+mInterval))
                {
                    mOffset = 0;
                }
            } else {
                if (mOffset >= (fontMetrics().width(text())+mInterval+mLogoImg.width()))
                {
                    mOffset = 0;
                }
            }

        } else {

            //如果的垂直滚动的话，滚动总距离和大于显示文字总高度后开始新一轮的滚动
            //如果有设置LOGO的话则要将LOGO的宽度加进去
            if (mLogoImg.isNull())
            {
                if (mOffset >= (fontMetrics().height() * textList.count()+mInterval))
                {
                    mOffset = 0;
                }
            } else {
                if (mOffset >= (fontMetrics().height() * textList.count()+mInterval+mLogoImg.height()))
                {
                    mOffset = 0;
                }
            }


        }

        scroll(-1, 0);
    } else {
        //如果没有到达我们设置的计数时间时，则执行默认的timerEvent()
        QWidget::timerEvent(event);
    }

}

/*******************************************
  description:显示事件，当界面显示就会调用此函数,界面开始显示
  则启动我们的计数器

  parameter：
  ******************************************/
void ScrollLabel::showEvent(QShowEvent *e)
{
    //启动计数器，mSpeed设置计数时间
//    mTimeId  = startTimer(mSpeed);

//    if (!isHide)
//    {
//        this->resize(msize);
//    }

    scrollTimer->start(mSpeed);
    mTimeId = mSpeed;
    QLabel::showEvent(e);

}


/*******************************************
  description:隐藏事件，当界面被隐藏时则调用此函数，此时定时器
  可以关闭了

  parameter：
  ******************************************/
void ScrollLabel::hideEvent(QHideEvent *e)
{
    if (scrollTimer->isActive())
    {
        scrollTimer->stop();
    }
    if (timer->isActive())
    {
        timer->stop();
    }
    mTimeId = 0;

    QWidget::hideEvent(e);
}


void ScrollLabel::playTimeOutSlot()
{
    this->stop();
    mOffset = 0;
    update();
    emit playFinish(4, mNumber);
}

void ScrollLabel::scrollText()
{
        //滚动的距离和，通过此参数来确定要开始绘制位置
        ++mOffset;

        //如果的水平滚动的话，滚动总距离和大于显示文字总宽度后开始新一轮的滚动
        if (mScrollType == HORIZONTALSCROLL)
        {
            //如果有设置LOGO的话则要将LOGO的宽度加进去
            if (mLogoImg.isNull())
            {
                if (mOffset >= (fontMetrics().width(text())+mInterval))
                {
                    mOffset = 0;
                }
            } else {
                if (mOffset >= (fontMetrics().width(text())+mInterval+mLogoImg.width()))
                {
                    mOffset = 0;
                }
            }

        } else {

            //如果的垂直滚动的话，滚动总距离和大于显示文字总高度后开始新一轮的滚动
            //如果有设置LOGO的话则要将LOGO的宽度加进去
            if (mLogoImg.isNull())
            {
                if (mOffset >= (fontMetrics().height() * textList.count()+mInterval))
                {
                    mOffset = 0;
                }
            } else {
                if (mOffset >= (fontMetrics().height() * textList.count()+mInterval+mLogoImg.height()))
                {
                    mOffset = 0;
                }
            }


        }

        scroll(-1, 0);
        this->repaint();

}


